/**
 * 新域名：
 * 生产
 oa.h5.liefengtech.com
 zhidian.h5.liefengtech.com
 测试
 oa.test.liefengtech.com
 zhidian.test.liefengtech.com
 */
(function (lf, w) {
    
    const IOS = 'IOS',
        ANDROID = 'Android',
        CHROME_VERSION = 37; //支持https 的谷歌版本
    
    lf.utils = {
        log: function (msg) {
            console.log(msg);
        },
        typeOf: function (obj) {
            return Object.prototype.toString.call(obj).slice(8, -1);
        },
        isDebug: function () {
            var host_name = location.hostname;
            return (host_name.indexOf('192.168') > -1 || host_name.indexOf('localhost') > -1);
        },
        /**
         * 判断员工是否是列丰人员
         * @param user 可传可不传。但一定要getUser
         * @returns {boolean}
         */
        isLF(user) {
            if (!user) user = liefeng.userInfo;
            if (!user.oemCode) throw new Error('请调用getUser方法/或员工没有oemCode');
            
            console.log('员工oemCode ' + user.oemCode);
            
            return user.oemCode === 'lf_property';
        },
        /**
         *
         * @param timestamp  一般是时间戳
         * @param fmt 默认格式为 yyyy-MM-dd hh:mm:ss
         * @returns {*}
         */
        format: function (timestamp, fmt = 'yyyy-MM-dd hh:mm:ss') {//时间格式化
            if (!timestamp || typeof (timestamp) !== 'number') return timestamp;
            
            let millisecs = timestamp.toString().length == 10 ? (timestamp * 1000) : timestamp,
                time_obj = new Date(millisecs), //参数是 时间戳转换的毫秒
                o = {
                    "M+": time_obj.getMonth() + 1,                 //月份
                    "d+": time_obj.getDate(),                    //日
                    "h+": time_obj.getHours(),                   //小时
                    "m+": time_obj.getMinutes(),                 //分
                    "s+": time_obj.getSeconds(),                 //秒
                    "q+": Math.floor((time_obj.getMonth() + 3) / 3), //季度
                    "S": time_obj.getMilliseconds()             //毫秒
                };
            
            if (/(y+)/.test(fmt))
                fmt = fmt.replace(RegExp.$1, (time_obj.getFullYear() + "").substr(4 - RegExp.$1.length));
            for (var k in o)
                if (new RegExp("(" + k + ")").test(fmt))
                    fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            return fmt;
        },
        getSys: function () {
            var ua = navigator.userAgent;
            if (ua.match(/iPhone|iPod/i) != null || ua.match(/iPad/i) != null) {
                return IOS;
            }
            else if (ua.indexOf('Android') > -1 || ua.indexOf('Linux') > -1) {
                return ANDROID;
            }
            else {
                return '';
            }
        },
        getEnv: function () {
            var ua = navigator.userAgent;
            if (ua.match(/LF/) == null) {
                return 'pc';
            }
            return 'app';
        },
        // 取得某个url参数
        getUrlParam: function (name, url) {
            var search = url || window.location.search.substr(1);
            
            if (search != '') {
                var re = new RegExp('(^|&|\\?)' + name + '=([^&]*)($|&)');
                var arr = search.match(re);
                if (arr !== null) {
                    return decodeURI(arr[2]);
                }
            }
            return '';
        },
        // 取得所有Params,返回object
        getUrlAllParam: function (url) {
            var search = url ? url.indexOf('?') == -1 ? '' : url.substr(url.indexOf('?') + 1)
                : window.location.search.substr(1);
            
            if (search != '') {
                var params_obj = {},
                    params_ary = search.split('&');
                
                params_ary.map(function (param) {
                    var param_ary = param.split('=');
                    params_obj['' + param_ary[0] + ''] = param_ary[1];
                });
                
                return params_obj;
            }
            return '';
        },
        /**
         * 给url后面追加参数
         * @param url 目标url
         * @param key 参数名
         * @param value 参数值
         */
        appendParam: function (url, key, value) {
            var _url = url.replace(key, '_');
            
            return _url.indexOf('?') > -1 ?
            _url + '&' + key + '=' + value :
            _url + '?' + key + '=' + value;
        },
        /**
         * 返回 https 或 http
         * @returns {string}
         */
        getProtocol(url) {
            const env = lf.utils.getEnv(),
                sys = lf.utils.getSys();
            let chromeVersion = '';
            
            if (sys == ANDROID && navigator.userAgent.split('Chrome/')[1]) chromeVersion = navigator.userAgent.split('Chrome/')[1].substr(0, 2);
            else if (sys == ANDROID) chromeVersion = 30;
            
            //levy 2016/7/16 ios/及选定版本的chrome for android才支持https
            //kobe 2016/08/24 改进 增加url传入判断 是否使用http以及https 适用于外部固定连接的传入
            
            if (url) {
                return (setProtocol() + url.split('://')[1])
            } else {
                return setProtocol()
            }
            
            function setProtocol() {
                if (location.href.indexOf('https') > -1) {
                    if (env == 'app' && sys == ANDROID && chromeVersion < CHROME_VERSION) {
                        return 'http://';
                    }
                    return 'https://';
                }
                else
                    return 'http://';
            }
            
            // if(location.href.indexOf('https') > -1) {
            //     if(env == 'app' && sys == ANDROID && chromeVersion < CHROME_VERSION) {
            //         return 'http://';
            //     }
            //     return 'https://';
            // }
            // else
            //     return 'http://';
        },
        /**
         * @desc [封装ajax]
         * @param option ajax参数
         * @param method 请求的方法名
         * @param cb 成功后的回调函数
         * @example ajax({data:{}},method, function callback(){});
         */
        ajax: function (option, method, sucCb, errCb) {
            
            var url = lf.apiPrefix + method;
            var _option = $.extend(true, {
                timeout: 8000,
                headers: {
                    openId: liefeng.userInfo.openId || (liefeng.userInfo.custLoginVo && liefeng.userInfo.custLoginVo.openId),
                },
                url: url,
                type: 'GET',
                dataType: 'json',
                data: {
                    page: 1,
                    size: 10, //兼容旧版本
                    pageSize: 10,
                },
                cache: false,
                beforeSend() {
                    lf.appJs.doLoading(true);
                },
                complete() {
                    lf.appJs.doLoading(false);
                },
                success: function (data) {
                    var dt = data;
                    if (dt.code == '200') {
                        var result = dt.data || dt.dataList;
                        sucCb && sucCb(result);
                    }
                    else {
                        alert(data.desc);
                        console && console.log(dt.code + ':' + dt.desc);
                        //fix 陈年老bug
                        if (location.href.indexOf('task-processing-detail') > -1) {
                            liefeng.bridgeJs.doLoading(false);
                            location.reload();
                        }
                    }
                },
                error: function (err, errorType, xhr) {
                    errCb && errCb();
                    console && console.log(err);
                    if (lf.utils.getEnv() == 'pc') {
                        console.log(errorType)
                        console.error('请求超时');
                    }
                    else {
                        let path = location.href;
                        if (path.indexOf('test') > -1) {
                            alert('生产不会有的提示信息： ajax ' + errorType);
                        }
                        if (path.indexOf('approval-detail') > -1)
                            location.reload();
                    }
                }
            }, option);
            
            //修改url, 判断使用http还是https
            if (_option.url.indexOf('http') == -1)
                _option.url = lf.utils.getProtocol() + _option.url;
            
            // debugAlert(_option.url);
            $.ajax(_option);
        },
        /**
         * 阻止冒泡
         * 需要参数:e 当前事件
         */
        stopBubble: function (e) {
            // 非IE浏览器
            if (e.stopPropagation) {
                e.stopPropagation();
            }
            else {
                //IE
                window.event.cancelBubble = true;
            }
            e.preventDefault();
        },
        /**
         * @desc [下拉函数封装]
         * @args [填入option进行覆盖]
         */
        pullRefresh: function (option) {
            //zepto是没有deep copy的。。。
            var _option = $.extend({
                    indicators: false,
                    container: "",//下拉刷新容器标识，querySelector能定位的css选择器均可，比如：id、.class等
                    contentdown: "下拉可以刷新",//可选，在下拉可刷新状态时，下拉刷新控件上显示的标题内容
                    contentover: "释放立即刷新",//可选，在释放可刷新状态时，下拉刷新控件上显示的标题内容
                    contentrefresh: "正在刷新...",//可选，正在刷新状态时，下拉刷新控件上显示的标题内容
                }, option),
                
                real_option = {
                    indicators: _option.indicators,
                    container: _option.container,//下拉刷新容器标识，querySelector能定位的css选择器均可，比如：id、.class等
                    down: {
                        contentdown: _option.contentdown,//可选，在下拉可刷新状态时，下拉刷新控件上显示的标题内容
                        contentover: _option.contentover,//可选，在释放可刷新状态时，下拉刷新控件上显示的标题内容
                        contentrefresh: _option.contentrefresh,//可选，正在刷新状态时，下拉刷新控件上显示的标题内容
                        callback: _option.callback //必选，刷新函数，根据具体业务来编写，比如通过ajax从服务器获取新数据；
                    },
                };
            
            if (_option.pullupFn) {
                //var 要传callback过去　
                real_option.up = {
                    //滚动到底部加载新数据
                    contentrefresh: '正在加载...',
                    callback: _option.pullupFn,
                }
            }
            
            
            mui.init({pullRefresh: real_option});
        },
        /**
         * 让输入法收起
         * e.target.focus();因为有时这句代码不起作用。
         * @param cb
         */
        slideDownKeyboard: function (cb) {
            console.log('trigger function: lf.utils.slideDownKeyboard');
            
            var fakeInput = document.createElement('input');
            fakeInput.setAttribute('type', 'text');
            fakeInput.setAttribute('style', 'border:none;background:#fff;position:absolute;left:-9999px;bottom:0;line-height:1px;height:1px;');
            document.body.appendChild(fakeInput);
            
            setTimeout(function () {
                fakeInput.focus();
            }, 10);
            
            setTimeout(function () {
                document.body.removeChild(fakeInput);
                cb && cb();
            }, 15);
        },
        /**
         * 2 dimensional array: 转化为二维数组
         * @param originArray 原始的一维数组
         * @param 转化后的二维数组 每一行的长度. 即 a[0]的长度
         */
        to2DArray (originArray, rowLen) {
            let array = [];
            
            //为二维数组赋值
            for (let i = 0, len = originArray.length; i < len; i++) {
                //二维数组的下标
                let index = Math.floor(i / rowLen);
                
                //undefined是不能进行操作的
                if (!array[index])
                    array[index] = [];
                array[index].push(originArray[i])
            }
            
            return array;
        },
    }
})(liefeng, window);